﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConfiguracionFisica.Dominio
{
    public class ConversorSerial
    {
        private string nombre;
        private string direccionIp;
        private List<Puerto> puertos;
        private bool habilitado;
        private static ISet<ConversorSerial> conversoresSerial;

        
        public ConversorSerial(string nombre, string direccionIp, List<Puerto> puerto, bool habilitado)
        {
            this.nombre = nombre;
            this.direccionIp = direccionIp;
            this.puertos = puerto;
            this.habilitado = habilitado;

        }

        private void validateCreation()
        {
            if (this.nombre == null || this.nombre.Length == 0) throw new FormatException("Debe ingresar al menos un nombre");
            if (this.direccionIp == null || this.nombre.Length == 0) throw new FormatException("Debe ingresar la direccion IP del conversor Serial");
            if (this.puertos.Count == 0) throw new FormatException("Debe ingresar al menos un puerto");
        }

        public bool Habilitado
        {
            get { return habilitado; }
            set { habilitado = value; }
        }

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        public string DireccionIp
        {
            get { return direccionIp; }
            set { direccionIp = value; }
        }

        public List<Puerto> Puerto
        {
            get { return puertos; }
            set { puertos = value; }
        }

        public static ISet<ConversorSerial> ConversoresSerial
        {
            get { return conversoresSerial; }
            set { conversoresSerial = value; }
        }
        //busca si el conversor tiene dicha barrera
        public static ConversorSerial conversorDe(Barrera barrera)
        {
            foreach (ConversorSerial unConversor in conversoresSerial)
            {
                if (unConversor.tieneBarrera(barrera))
                    return unConversor;
            }
            return null; //lanzar excepcion
        }

        //busca si el conversor tiene dicho lector
        public static ConversorSerial conversorDe(Lector lector)
        {
            foreach (ConversorSerial unConversor in conversoresSerial)
            {
                if (unConversor.tieneLector(lector))
                    return unConversor;
            }
            return null; //lanzar excepcion
        }

        private bool tieneLector(Lector lector)
        {
            return (this.puertoDe(lector) != null) ? true : false;
        }

        private object puertoDe(Lector lector)
        {
            foreach (Puerto unPuerto in this.puertos)
            {
                if (unPuerto.tieneLector(lector))
                    return unPuerto;
            }
            return null;
        }

        private bool tieneBarrera(Barrera barrera)
        {
            return (this.puertoDe(barrera) != null) ? true : false;
        }

        private Puerto puertoDe(Barrera barrera)
        {
            foreach (Puerto unPuerto in this.puertos)
            {
                if (unPuerto.tieneBarrera(barrera))
                    return unPuerto;
            }
            return null;
        }

        internal void ejecutarApertura(Barrera barrera)
        {
            Puerto puertoConBarrera = puertoDe(barrera);
            this.abrirBarreraFisica(puertoConBarrera, barrera);
        }

        public void abrirBarreraFisica(Puerto puerto, Barrera barrera)
        {
            Console.WriteLine("Se genero comando con ip " + this.direccionIp + " , puerto: " + puerto.Numero + ", barrera: " + barrera.Nombre);
        }
    }
}
